home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 011-020 / amok11 / r.o.m. / m2sources / formelauswertung.def < prev    next >
Text File  |  1993-11-04  |  6KB  |  121 lines

  1. DEFINITION MODULE Formelauswertung;
  2. (*
  3.   Created:   30.8.87
  4.   Changed:   12.02.88/29.8.88/1.10.88 by
  5.              Stefan Salewski
  6.              Stolper Weg 3
  7.              2160 Stade   West-Germany
  8.              Tel: 04141/61130
  9.              
  10.   Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
  11.   This Module may be freely copied. But please
  12.   leave my name in. Thanks....Stefan 
  13.   
  14.   
  15.   Berechnung von Formeln in Form von Strings
  16.   ------------------------------------------
  17.   Dieses Modul macht es moeglich, Programme zu schreiben, die
  18.   beliebige mathematische Formeln in Form eines Strings einlesen,
  19.   die Formel ueberpruefen und dann beliebig oft berechnen. Damit
  20.   wird ein Nachteil, den Modula gegenueber Interpreter-Sprachen wie
  21.   Basic hat, aufgehoben.
  22.   Benutzung dieses Moduls:
  23.   Zuerst liest man die mathematische Formel in Form eines Strings ein,
  24.   dieser String muss von Typ Formelstring sein.
  25.   Danach muss mit AssignLong oder AssignFFP allen Variablen, die in der
  26.   Formel vorkommen, ein (vorlaeufiger) Wert zugewiesen werden.
  27.   Dann wird DefFormel mit diesem String und einer beliebigen Formelnummer
  28.   zwieschen 1 und 10 aufgerufen. Ist der String ein korrekter mathematischer
  29.   Ausdruck, wie er z.B. auch von R.o.M. verwendet wird, (z.B. 'sin(3.5*x)'
  30.   oder '34/34.55+12.34E-123*sinh(12.7-2.12)-12.34^34') so ist die Fehlernummer
  31.   gleich Null. Nun koennen die Variablen mit AssignFFP oder AssignLong
  32.   beliebig geaendert werden, und die Formel kann mit Longberechnung oder
  33.   FFPBerechnung beliebig oft berechnet werden.
  34.   Sowohl DefFormel als auch FFPBerechnung und LongBerechnung liefern
  35.   bei Fehlern Fehlernummern. Diese Fehlernummer sollten nach jeder
  36.   Berechnung abgefragt werden. Ist sie ungleich null, so kann man mit
  37.   dem Modul FormelausFText die Ursache des Fehlers in Form eines Textes
  38.   erfahren.
  39.   Die Geschwindigkeit der Berechnung ist, wie man an R.o.M. sieht, recht
  40.   hoch. FFPBerechnung braucht zur Berechnung einer Formel ungefaehr
  41.   doppelt so lange wie es dauern wuerde, die selbe Formel in compilierter
  42.   Form zu berechnen. Bei LongBerechnung wird dagegen kaun ein Unterschied
  43.   zu der compilierten Formel bemerkbar sei, da die Zeit, die fuer die
  44.   Interpretation der Formel benoetigt wird, sehr klein gegenueber der
  45.   Zeit, die LongReal-Berechnungen in Anspruch nehmen, ist.
  46.   Eine Procedure RealBerechnung existiert momentan nicht, der Grund
  47.   dafuer ist, das Bereichsueberschreitungen bei arithmetischen
  48.   Operationen zwieschen REAL-Zahlen keine definierten Resultate ergeben.
  49.   Also kann ich diese Ueberlaufe nicht sicher festelllen und daher
  50.   nicht fuer die Korrektheit des Ergebnisses garantieren.
  51.   Formeln mit verschiedener Formelnummer koennen unabhaengig voneinander
  52.   Benutzt werden. Man kann also mehrere Formeln definieren und dann
  53.   abwechselnd berechnen lassen. Formelnummer 0 nicht verwenden, sie wird
  54.   intern benutzt.
  55. *)
  56.  
  57. FROM SYSTEM IMPORT FFP;
  58.   CONST
  59.     StrLength=255; (* so gross duerfen die zu berechnenden Ausdruecke sein  *)
  60.     AnzahlFormeln=10;(* Zahl der Formeln die gleichzeitig benutzt werden    *)
  61.                      (* koennen, Nummer 0 nicht verwenden                   *)
  62.   TYPE 
  63.     Formelnummer=[0..AnzahlFormeln];
  64.     Formelstring=ARRAY[0..StrLength] OF CHAR;
  65.     (* Formelnummer 0 nicht benutzen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
  66.  
  67. VAR
  68. (* Achtung: Normalerweise sollte die Definition von Variablen ueber
  69.    AssignLong und AssignFFP erfolgen. Wenn es sehr auf die Geschwindigkeit
  70.    ankommt, koennen auch vorsichtig direkt an varListLong und varListFFP
  71.    Werte zugewiesen werden.
  72.    Ok:=AssignFFP('x',23.456) entspricht varListFFP['x']:=23.456
  73. *)
  74.   varListLong:ARRAY['A'..'z'] OF LONGREAL;
  75.   varListFFP:ARRAY['A'..'z'] OF FFP;
  76.     
  77.   PROCEDURE AssignLong(c:CHAR;x:LONGREAL):BOOLEAN;
  78.   (* Weist der Variablen c den Wert x zu                                    *)
  79.   (* c ist Buchstabe => TRUE                                                *)
  80.   
  81.   PROCEDURE AssignFFP(c:CHAR;x:FFP):BOOLEAN;
  82.   (* Weist der Variablen c den Wert x zu                                    *)
  83.   (* c ist Buchstabe => TRUE                                                *)
  84.   
  85.   PROCEDURE ClearVar(c:CHAR);
  86.   (* Variable c gilt als undefiniert und kann nicht mehr in Formeln
  87.      benutzt werden                                                         *)
  88.   
  89.   PROCEDURE GetLongValue(c:CHAR;VAR x:LONGREAL):BOOLEAN;
  90.   (* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde           *)
  91.   
  92.   PROCEDURE GetFFPValue(c:CHAR;VAR x:FFP):BOOLEAN;
  93.   (* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde           *)
  94.   
  95.   PROCEDURE DefFormel(nummer:Formelnummer;VAR str:ARRAY OF CHAR;
  96.                       korrekt,onlyLong:BOOLEAN):CARDINAL;
  97.                       
  98.   (* Definiert eine neue Formel.Ist korrekt=TRUE, so ist 4+3*8= 28 sonst 56 *)
  99.   (*str wird nicht veraendert,bei Fehler bleibt die alte Formel unveraendert*)
  100.   (*Ist onlyLong=TRUE, so koennen in der Formel auch Zahlen > 1.0E18 vor-   *)
  101.   (*kommen, dann darf aber nicht FFPBerechnung benutzt werden               *)
  102.   (* Fehlernummern:                                                         *)
  103.   (* 0:Kein Fehler                                                          *)
  104.   (* 31:Formel ist leer                                                     *)
  105.   (* 32:nicht alle Variablen sind initialisiert(mit Assign...)              *)
  106.   (* 33:Syntaxfehler                                                        *)
  107.   (* 34:Formel enthaelt ungueltiges Zeichen                                 *)
  108.   (* 35:Formel enthaelt zu grosse Zahlen                                    *)
  109.  
  110.   PROCEDURE FFPBerechnung(nummer:Formelnummer;VAR ergebnis:FFP;
  111.                   VAR fehlernummer:CARDINAL);
  112.                           
  113.   PROCEDURE LongBerechnung(nummer:Formelnummer;VAR ergebnis:LONGREAL;
  114.                            VAR fehlernummer:CARDINAL);
  115.                        
  116.   (* Kein Fehler bei Berechnung  => Fehlernummer=0                          *)
  117.  
  118.  
  119. END Formelauswertung.def
  120.  
  121.